/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MapeamentoPersistencia;

import Negocio.*;
import Persistencia.*;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author v3550
 */
public class AdaptadorPersistencia implements InterfaceCadastro {
    
    InterfaceCadastroDTO fachada = null;
    
    private static AdaptadorPersistencia ref = null;
    
    private AdaptadorPersistencia() throws DAOException{
            fachada = new FachadaPersistencia();
    } 
    
    public static AdaptadorPersistencia getInstance() throws DAOException
    {
        if(ref == null) {
            ref = new AdaptadorPersistencia();
        }
        return ref;
    }
    
    public Categoria mapCatDTOEnt(CategoriaDTO c)
    {
         Categoria cat = new Categoria();
         cat.setId(c.getId());
         cat.setNome(c.getNome());
         
         return cat;
    }
    
    public CategoriaDTO mapCatEntDTO(Categoria c)
    {
         CategoriaDTO cat = new CategoriaDTO();
         cat.setId(c.getId());
         cat.setNome(c.getNome());
         
         return cat;
    }
    
    public UsuarioDTO mapUserEntDTO(Usuario u)
    {
        UsuarioDTO user = new UsuarioDTO();
        user.setId(u.getId());
        user.setNome(u.getNome());
        user.setEmail(u.getEmail());
        return user;
    
    }

    public Usuario mapUserDTOEnt(UsuarioDTO u)
    {
        Usuario user = new Usuario();
        user.setId(u.getId());
        user.setNome(u.getNome());
        user.setEmail(u.getEmail());
        
        return user;
    }
    
    public Artigo mapArtigoDTOEnt(ArtigoDTO a)
    {
         Artigo artigo = new Artigo();
         artigo.setNome(a.getNome());
         artigo.setQtdItensVenda(a.getQtdItensVenda());
         artigo.setCategoria(a.getCategoria());
         artigo.setId(a.getId());
         artigo.setUsuario(a.getUsuario());
         artigo.setValorInicial(a.getValorInicial());
         artigo.setDataInicial(a.getDataInicial());
         artigo.setDataFinal(a.getDataFinal());
         artigo.setHoraInicial(a.getHoraInicial());
         artigo.setHorafinal(a.getHorafinal());
         artigo.setPoliticaVencedor(a.getPoliticaVencedor());

         return artigo;
    }
    
    public ArtigoDTO mapArtigoEntDTO(Artigo a)
    {
        ArtigoDTO artigo = new ArtigoDTO();
        artigo.setNome(a.getNome());
        artigo.setQtdItensVenda(a.getQtdItensVenda());
        artigo.setCategoria(a.getCategoria());
        artigo.setId(a.getId());
        artigo.setUsuario(a.getUsuario());
        artigo.setValorInicial(a.getValorInicial());
        artigo.setDataInicial(a.getDataInicial());
        artigo.setDataFinal(a.getDataFinal());
        artigo.setHoraInicial(a.getHoraInicial());
        artigo.setHorafinal(a.getHorafinal());
        artigo.setPoliticaVencedor(a.getPoliticaVencedor());
        
        return artigo;
    }
    
    @Override
    public boolean adicionarUsuario(Usuario p) throws DAOException
    {
        UsuarioDTO  elementoInserido = fachada.adicionarUsuario(mapUserEntDTO(p));
        //setar id do elemento inserido
        p.setId(elementoInserido.getId());
        if(elementoInserido != null) {
            return true;
        } else {
            return false;
        }
       
    }
    
    @Override
    public boolean adicionarCategoria(Categoria c) throws DAOException{
        //baita mão para pegar o id da categoria inserida
        CategoriaDTO elementoInserido =fachada.adicionarCategoria(mapCatEntDTO(c));
        //setar id do elemento inserido
        c.setId(elementoInserido.getId());
        
        if(elementoInserido != null) {
            return true;
        }
        else {
            return false;
        }
    }
    
    @Override
    public boolean adicionarArtigo(Artigo a) throws DAOException{
        ArtigoDTO elementoInserido = fachada.adicionarArtigo(mapArtigoEntDTO(a));
        a.setId(elementoInserido.getId());
        if(elementoInserido != null) {
            return true;
        } else {
            return false;
        }
    }
    
    
    @Override
    public boolean adicionarLance(Lance l) throws DAOException{
         LanceDTO elementoInserido = fachada.adicionarLance(mapLanceEntDTO(l));
         // recupera os dados inseridos
         l.setDataLance(elementoInserido.getDataLance());
         l.setHoraLance(elementoInserido.getHoraLance());
         l.setNomeDoUsuario(elementoInserido.getNomeDoUsuario());

        if(elementoInserido != null) {
            return true;
        } else {
            return false;
        }
    }
    
    @Override
    public List<Usuario> getUsuarios() throws DAOException{
      List<Usuario>  list = new LinkedList<>();
        for(UsuarioDTO u: fachada.getUsuarios())
        {
             list.add(mapUserDTOEnt(u));
        }  
      return list;
    }

    @Override
    public List<Usuario> getUsuariosParaLance(Artigo a) throws DAOException{
      List<Usuario>  list = new LinkedList<>();
        for(UsuarioDTO u: fachada.getUsuariosNaoDeuOLance(mapArtigoEntDTO(a)))
        {
             list.add(mapUserDTOEnt(u));
        }  
      return list;
    }
    
    @Override
    public List<Categoria> getCategorias() throws DAOException{
       List<Categoria>  list = new LinkedList<>();
       for(CategoriaDTO c : fachada.getCategorias())
       {
          list.add(mapCatDTOEnt(c));
       }
      return list;
    }
    
    @Override
    public List<Artigo>    getArtigos() throws DAOException{
        List<Artigo>  list = new LinkedList<>();
          
        for(ArtigoDTO u: fachada.getArtigos())
        {
             list.add(mapArtigoDTOEnt(u));
        }  
      return list;
    }

    public List<Lance> getLances() throws DAOException{
      List<Lance>  list = new LinkedList<>();
      return list;
    }

    @Override
    public List<Artigo> getArtigoAberto() throws DAOException {
     List<Artigo>  list = new LinkedList<>();
          
        for(ArtigoDTO u: fachada.getArtigosAberto())
        {
             list.add(mapArtigoDTOEnt(u));
        }  
      return list;
    }

    @Override
    public List<Artigo> getArtigoFechado() throws DAOException {
        List<Artigo>  list = new LinkedList<>();
          
        for(ArtigoDTO u: fachada.getArtigosFechado())
        {
             list.add(mapArtigoDTOEnt(u));
        }  
      return list;
    }
    
     private Lance mapLanceDTOEnt(LanceDTO u) {
        Lance l = new Lance();
        l.setNomeDoUsuario(u.getNomeDoUsuario());
        l.setId(u.getId());
        l.setId_artigo(u.getId_artigo());
        l.setId_usuario(u.getId_usuario());
        l.setLance(u.getLance());
        l.setDataLance(u.getDataLance());
        l.setHoraLance(u.getHoraLance());
        return l;
    }
    
     private LanceDTO mapLanceEntDTO(Lance u) {
        LanceDTO l = new LanceDTO();
        l.setNomeDoUsuario(u.getNomeDoUsuario());
        l.setId(u.getId());
        l.setId_artigo(u.getId_artigo());
        l.setId_usuario(u.getId_usuario());
        l.setLance(u.getLance());
        return l;
    }

    @Override
    public List<Lance> getLance(Artigo a) throws DAOException {
        List<Lance>  list = new LinkedList<>();
        for(LanceDTO u: fachada.getLances(mapArtigoEntDTO(a)))
        {
             list.add(mapLanceDTOEnt(u));
        }  
      return list;
    }

    @Override
    public double getValorMínimoLance(Artigo a) throws DAOException {
          return fachada.getValorMinimo(mapArtigoEntDTO(a));
    }
/*
    @Override
    public boolean validaDataHoraLeilao(int a) throws DAOException {
        return fachada.validaDataHoraLance(a);
    }
  */

    @Override
    public boolean validaDataHoraLeilao(int a) throws DAOException {
       return fachada.validaDataHoraLance(a);
    }

    @Override
    public boolean fecharLeilao(int a) throws DAOException {
      return fachada.fecharLeilao(a);
    }
}
